Star Schema完全参考手册读书笔记九
维度一致性的基本需求
为支持成功的横向钻取对比,必须保证维度表的一致性,可以通过保证两个表相同的方法来解决。对于相同性涉及两个关键的部分:两个表必须结构相同且内容相同。
结构相同
在结构方面,表必须有相同的维度列集合。对应的维度列应该具有相同的列名,这样就不会发生对等价性判断的困惑。这些对应的列应该具有相同的数据类型定义,以保证内容的同一性。
内容相同
在内容方面,维度列中存在的值必须具有相同的表示形式。由于列值被用于在横向钻取第二阶段中连接每个星型模式的中间结果集,因此使用一致的列值不需要进行清洗、转换以实现对应列值的匹配,从而保证合并操作需要的列值的同一性。
不具有可共享公共维度表,但存在可共享的公共维度属性的两个星型模式,它们的公共维度属性中的任何一个都能作为横向钻取的基础。实现横向钻取分为两个阶段,在第一阶段,分别从每个星型模式中查询并获取事实,将它们聚集到同一维度细节层次上。在第二阶段,合并获取的中间结果集,构建两种事实的比率。尽管两种星型模式不存在可共享的维度表,但这个过程仍然可以完成。
维度一致性的类型
1、共享维度表
最常见的维度一致性形式发生在两个星型模式共享相同的逻辑维度表时。这个共享的维度可能是同一个物理表,也有可能由两个或更多个等价表组成。如果按照两个或更多个等价表实施,共享维度就必须具有以下两个特性:1、表共享相同的结构。2、表共享相同的内容。当两个或更多个维度表满足这些要求时,这些表格被称为一致的。
共享的维度表支持使用其中任意的维度属性横向钻取相关的事实表。结构和内容相同的不同维度表也支持对事实表的横向钻取,完全相同的副本也是一致的。
当一个共享维度存在多个副本时,需要一个单独的ETL过程负责处理新的和发生改变的数据。使用某个事实表的不正确的副本将会产生不正确的结果。
共享维度的另一个版本允许副本包含基础维度中行的子集,通常与表示实体的子类对应。这一子类可以被额外的特殊子类属性所修饰。
2、一致性上卷
当来自某个表的维度属性是其他表的维度属性的子集,并且公共属性具有相同的结构和内容时,这个表包含的子集称为一致性上卷。相关的事实表能在任何公共维度属性上通过横向钻取进行比较。
保持一致性并不需要维度表完全相同。如果能够满足以下条件,不相同的维度表也能够支持横向钻取过程:表的维度属性是其他表的维度属性的子集;公共维度属性具有相同的结构和内容。当满足这些要求时,维度表就是一致的。可以基于任何一个公共维度属性,通过横向钻取比较相关事实表。两个维度中较小的那个叫做一致性上卷,较大的那个称为基本维度。注意每个一致性上卷都包含基表中没有的一列:代理键。
当来自某个表的维度属性是其他表的维度属性的子集,并且公共属性具有相同的结构和内容时,这个表包含的子集称为一致性上卷。相关的事实表能在任何公共维度属性上通过横向钻取进行比较。
确保一致性上卷的实例值与基本维度的实例值匹配的最好方式是指定基本维度作为它的来源。采用此方法可以确保对基于源数据构建的实例值计算的一致性。开发者可能会首先选择处理基本维度,然后检查新的和变化的行来处理上卷。另一种方式是,选择建立单独的例程来处理源数据,并同时处理基本维度和上卷中涉及的新增的和发生变化的行。一些开发者喜欢使用数据过渡区来标准化结构,处理和发现原子层的变化,然后将它们应用到基本维度和上卷表中。
ETL开发者常常会发现一致性上卷存在令人困惑的副作用。应用变化类型1时,常常需要将在上卷维度中的两行合并。此处的问题是被合并行的代理键可能已经被存在的事实表行引用,对其合并时可能需要修改事实表中的某些外键。为了避免这种额外处理,有时可以允许上卷维度包含除代理键之外的相同的行。
3、一致的退化维度
在退化维度上执行横向钻取操作是可能实现的,其成功与否取决于是否遵守本章中反复强调的同样的要求:公共维度属性必须有相同的结构和内容。遵守该要求就可以为横向钻取第一阶段涉及的每个事实表指定同样的聚集范围,并且允许在第二阶段中连接中间结果集。
具有等价表和一致性上卷后,还需要注意确保在每个表中出现相同值的组合。这可以保证浏览查询能够获得同样的结果。
4、重叠维度
尽管很少出现,采用重叠属性集可以保证不等价的维度表保持一致性。
当两个表共享一组公共属性,但其中一个不是另外一个的真子集时,两个表都不能被描述成一致性上卷。当两个维度重叠时,将通过他们的公共属性保持一致性。公共属性必须共享相同的内容和结构。
设计者通常尽量避免采用重叠维度。目前至少存在三种可选方案用于将重叠维度移动到不同的表中。